package pe.com.bbva.modpre.persistencia.hibernate;

import java.math.BigDecimal;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import pe.com.bbva.modpre.dominio.Finanza;
import pe.com.bbva.modpre.persistencia.FinanzaDAO;
import pe.com.bbva.modpre.ui.ModpreApplication;

@Repository
@SuppressWarnings("serial")
public class FinanzaHibernate extends BaseHibernate<Finanza, Long> 
implements FinanzaDAO {
	Logger logger = LogManager.getLogger(ModpreApplication.class.getName());
	@Autowired
	DataSource dataSource;
	@Value("${jdbc.schema}")
	private String schema;

	@Autowired
	private JdbcTemplate jdbcTemplate;
	
	public String obtenerObjetoBBDD(String objetoBBDD) {
		return schema+"."+objetoBBDD;
	}
	@Autowired
	public FinanzaHibernate(SessionFactory sessionFactory){
		setSessionFactory(sessionFactory);
	}

	@Override
	public Finanza obtenerFinanzaxCodigoCentral(String codigoCentral) {
		return obtenerHql("select f from Finanza f where codigoCentral=?", codigoCentral);
	}

	@Override
	public List<Finanza> guardarMargenTotal(List<Finanza> finanzas) {
		// TODO Auto-generated method stub
		StringBuilder sql=new StringBuilder();
		sql.append("select f.CODIGO_CENTRAL,f.margen_ord,s.margen_colectivo,f.margen_ord + s.margen_colectivo sumatotal from "+ obtenerObjetoBBDD("cfg_finanza f "));
		sql.append("inner join "+obtenerObjetoBBDD("cfg_sistema s ")+"on f.codigo_central=s.codigo_central ");
		List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql.toString());
		Map<String,Object> mapTotal = new HashMap<String, Object>();
		for (Map<String, Object> map : rows) {
			mapTotal.put((String)map.get("CODIGO_CENTRAL"), map.get("SUMATOTAL"));
		}
		for (Finanza finanza : finanzas) {
			finanza.setMargenTotal((BigDecimal)mapTotal.get(finanza.getCodigoCentral()));
		}
		return finanzas;
	}
	@Override
	public String ejecutarProcedureFinanza(String nombre) {
		Connection conn=null;
		CallableStatement cStmt =null;
		String error="";
		try {
			conn = dataSource.getConnection();
			cStmt = conn.prepareCall("{call MODPRE.PK_CARGA_ARCHIVO.SP_CARGAR_FINANZA(?,?)}");
			cStmt.setString(1, nombre);
			cStmt.registerOutParameter(2, java.sql.Types.VARCHAR);
			cStmt.execute();
			error = cStmt.getString(2);
		} catch (SQLException e1) {
			error="Modpre SP_CARGAR_FINANZA "+e1;
		}finally{
			if(cStmt!=null){
				try {
					cStmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if(conn!=null)
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
		}
		if(StringUtils.isNotBlank(error)){
			logger.info(error);
		}
		return error;
	}

}
